﻿#ifndef CDBTABLEINFOMGR_H
#define CDBTABLEINFOMGR_H

#include <QVariant>
#include <QSqlRecord>
#include "cdbtabledatainfo.h"
#include "cdatabasexml.h"

class QMutex;

/***********************************************
* [className]   CDbTableInfoMgr
* [func]        数据库表信息管理类
* [author]      jhb
* [date]        2023-12-14 10:28
* [Modification Log]
* Version               By              Notes
* v0.0.1                jhb             初次建立
************************************************/
class CDbTableInfoMgr : public CDbTableDataInfo
{
public:
    CDbTableInfoMgr();
    CDbTableInfoMgr(const CDbTableInfo &info);
    virtual ~CDbTableInfoMgr();
    /***************************************************************
    * @datatime 2023-12-15 09:52:27
    * @author   jhb
    * @brief    设置工作类型
    * @input    const int &nWorkType        工作类型
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    void setWorkType(const int &nWorkType);

    /***************************************************************
    * @datatime 2023-12-15 13:15:42
    * @author   jhb
    * @brief    设置事务ID
    * @input    const QString &sTransactionID       事务ID
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void setTransactionID(const QString &sTransactionID);

    /***************************************************************
    * @datatime 2023-12-13 16:29:44
    * @author   jhb
    * @brief    添加条件（where后面的条件）
    * @input    const QString &sFilter                  条件（格式"filter1=,filter2>")
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addFilterName(const QString &sFilter);

    /***************************************************************
    * @datatime 2023-12-13 16:32:05
    * @author   jhb
    * @brief    添加条件（where后面的条件）
    * @input    const QVector<QString> &vecFilter       条件
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addFilterName(const QVector<QString> &vecFilter);

    /***************************************************************
    * @datatime 2023-12-15 11:04:43
    * @author   jhb
    * @brief    添加条件值
    * @input    const QString &sValue                   条件值
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addFilterValue(const QString &sValue);

    /***************************************************************
    * @datatime 2023-12-13 16:33:44
    * @author   jhb
    * @brief    添加条件值
    * @input    const QVector<QString> &vecValue        条件值
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addFilterValue(const QVector<QString> &vecValue);

    /***************************************************************
    * @datatime 2023-12-13 16:37:30
    * @author   jhb
    * @brief    添加字段名
    * @input    const QString &sResult                  字段（格式"Field1=,Field2>")
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addResultField(const QString &sField);

    /***************************************************************
    * @datatime 2023-12-13 16:42:52
    * @author   jhb
    * @brief    添加字段名
    * @input    const QVector<QString> &vecField        字段
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addResultField(const QVector<QString> &vecField);

    /***************************************************************
    * @datatime 2023-12-13 16:42:52
    * @author   jhb
    * @brief    添加字段名
    * @input    const QVector<QVariant> &vecField        字段
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addResultField(const QVector<QVariant> &vecField);

    /***************************************************************
    * @datatime 2023-12-15 11:06:53
    * @author   jhb
    * @brief    添加字段值
    * @input    const QString &sValue        字段值
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addResultValue(const QString &sValue);

    /***************************************************************
    * @datatime 2023-12-13 16:44:10
    * @author   jhb
    * @brief    添加字段值
    * @input    const QVector<QString> &vecValue        字段值
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addResultValue(const QVector<QString> &vecValue);

    /***************************************************************
    * @datatime 2023-12-13 16:44:10
    * @author   jhb
    * @brief    添加字段值
    * @input    const QVector<QVariant> &vecValue        字段值
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addResultValue(const QVector<QVariant> &vecValue);

    /***************************************************************
    * @datatime 2023-12-13 17:02:59
    * @author   jhb
    * @brief    添加排序字段
    * @input    const QString &sField                   字段（格式"Field1=,Field2>")
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addOrderByField(const QString &sField);

    /***************************************************************
    * @datatime 2023-12-13 17:05:14
    * @author   jhb
    * @brief    添加排序字段
    * @input    const QVector<QString> &vecField        字段
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addOrderByField(const QVector<QString> &vecField);

    /***************************************************************
    * @datatime 2023-12-13 17:06:30
    * @author   jhb
    * @brief    添加排序规则
    * @input    const QString &sRule                    排序规则（格式"rule1,rule2"）
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addOrderByRule(const QString &sRule);

    /***************************************************************
    * @datatime 2023-12-13 17:10:49
    * @author   jhb
    * @brief    添加排序规则
    * @input    const QVector<QString> &vecRule         排序规则
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addOrderByRule(const QVector<QString> &vecRule);

    /***************************************************************
    * @datatime 2023-12-14 08:45:14
    * @author   jhb
    * @brief    添加条件间连接符
    * @input    const QMap<int, QString> &mapSymbol         条件间连接符
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addSymbol(const QMap<int, QString> &mapSymbol);

    /***************************************************************
    * @datatime 2023-12-14 08:47:34
    * @author   jhb
    * @brief    添加条件间连接符
    * @input    const int &nIndex           条件索引（在哪个条件前面，既为哪个序号，序号自0开始）
    *           const QString &symbol       连接符号
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addSymbol(const int &nIndex, const QString &symbol);

    /***************************************************************
    * @datatime 2023-12-14 08:50:37
    * @author   jhb
    * @brief    添加筛选
    * @input    const int &nLimit           筛选数量
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addLimit(const int &nLimit);

    /***************************************************************
    * @datatime 2023-12-14 08:51:43
    * @author   jhb
    * @brief    添加自定义SQL
    * @input    const QString &sSql         自定义SQL（默认规则为Mysql）
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addSql(const QString &sSql);

    /***************************************************************
    * @datatime 2024-02-19 08:47
    * @author   jhb
    * @brief    添加自定义SQL
    * @input    const QString &sSql             自定义SQL（默认规则为Mysql）
    *           const QMap<QString, QVariant> &mapBindValue    需要绑定（bindvalue）的数据
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addSql(const QString &sSql, const QMap<QString, QVariant> &mapBindValue);

    /***************************************************************
    * @datatime 2024-02-18 16:35
    * @author   jhb
    * @brief    添加绑定数据
    * @input    const QMap<QString, QVariant> &mapBindValue    添加SQL后，需要绑定的数据
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addBindValue(const QMap<QString, QVariant> &mapBindValue);

    /***************************************************************
    * @datatime 2023-12-15 11:31:58
    * @author   jhb
    * @brief    获取查询结果
    * @input    无
    * @output   无
    * @return   QVector<QSqlRecord>         查询结果集
    * @note
    ****************************************************************/
    virtual QVector<QSqlRecord> getReRecord();

    /***************************************************************
    * @datatime 2023-12-14 08:57:58
    * @author   jhb
    * @brief    数据资源上锁
    * @input    无
    * @output   无
    * @return   true:锁定成功
    *           false:锁定失败
    * @note
    ****************************************************************/
    virtual bool tryLock(int nTime=0);

    /***************************************************************
    * @datatime 2023-12-14 08:57:10
    * @author   jhb
    * @brief    数据资源解锁
    * @input    无
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void unlock();

    /***************************************************************
    * @datatime 2023-12-15 11:19:25
    * @author   jhb
    * @brief    获取最后执行的SQL
    * @input    无
    * @output   无
    * @return   QString             数据库语句
    * @note
    ****************************************************************/
    virtual QString getLastSql();

    /***************************************************************
    * @datatime 2023-12-15 11:18:15
    * @author   jhb
    * @brief    获取错误信息
    * @input    无
    * @output   无
    * @return   QString         错误信息
    * @note
    ****************************************************************/
    virtual QString getLastError();

    /***************************************************************
    * @datatime 2024-03-07 15:40
    * @author   jhb
    * @brief    获取sql类型
    * @input    无
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual int getSqlType();

    //重置数据，每次引用前重置数据
    void resetInfo();

public:
    QString                     m_sMode;                        //模式名
    QString                     m_sTableName;                   //库表名
    QMap<QString, QVariant>     m_mapFieldValue;                //字段与值映射
    QMutex                      *m_pMutex;                      //库表资源锁
    bool                        m_bInitRecord;                  //初始化标识
    bool                        m_bSqlOperIsOk;                 //语句执行标识
    int                         m_nWorkType;                    //工作类型
    QString                     m_sTransactionID;               //事务ID
    //查询结果
    QVector<QSqlRecord>         m_vecReRecord;                  //结果集
    //针对拼SQL方式的数据
    QVector<QString>            m_vecFilterFieldName;           //想要操作的 筛选条件字段名称 如where 后面的
    QVector<QString>            m_vecFilterFieldValue;          //筛选条件字段值 如where 后面的
//    QVector<QString>            m_vecResultFieldName;           //想要操作的 更新字段的名称  如 insert 后面的   update后面的
    QVector<QVariant>           m_vecResultFieldNameVar;        //
//    QVector<QString>            m_vecResultFieldValue;          //更新字段的值    如 insert 后面的   update后面的
    QVector<QVariant>           m_vecResultFieldValueVar;       //
    QVector<QString>            m_vecOrderName;                 //排序名
    QVector<QString>            m_vecOrderValue;                //排序规则
    QMap<int, QString>          m_mapSymbol;                    //条件间符号（考虑到条件组合需要符号串联）
    int                         m_nLimit;                       //限制查询数量
    QVector<QVector<QString>>   m_vecBatchData;                 //QVector<QString>存放 一条记录中的数据  QVector<>存放多条记录
    //针对自定义及未知方式的处理
    int                         m_nSqlType;                     //自定义SQL类型
    QString                     m_sSql;                         //自定义SQL
    //绑定数据
    QMap<QString, QVariant>     m_mapBindValue;                 //绑定数据
    //错误结果
    QStringList                 m_listErr;                      //错误信息（索引0：SQL，索引1：错误信息）
};

#endif // CDBTABLEINFOMGR_H
